package algo3.tp1.ejercicios;

import java.util.Iterator;
import java.util.LinkedList;

public class Matriz {
	private Celda[][] casillas;
	private int filas, columnas;
	
	public Matriz(int[][] matriz) {
		filas = matriz.length;
		columnas = matriz[0].length;
		casillas = new Celda[filas][columnas];

		for (int i = 0; i < matriz.length; i++) {
			for (int j = 0; j < matriz[i].length; j++) {
				casillas[i][j] = new Celda(i, j, matriz[i][j]);
			}
		}
	}
	
	public boolean existeCasilla(int fila, int columna) {
		return fila < filas && columna < columnas && fila >= 0 && columna >= 0;
	}

	public Celda dameCasilla(int fila, int columna) {
		return casillas[fila][columna];
	}

	public LinkedList<Celda> vecinas(Celda casilla) {
		LinkedList<Celda> arrayVecinas = new LinkedList<Celda>();
		for(Direccion d : Direccion.values()){
			Posicion pos = casilla.damePosicion().mover(d);
			if (existeCasilla(pos.dameFila(), pos.dameColumna())) {
				arrayVecinas.add(dameCasilla(pos.dameFila(), pos.dameColumna()));
			}
		}

		return arrayVecinas;
	}

	public class IteradorCasilla implements Iterator<Celda>,
			Iterable<Celda> {
		private int fila, columna;

		public IteradorCasilla() {
			fila = columna = 0;
		}

		public boolean hasNext() {
			return fila < filas;
		}

		public Celda next() {
			Celda c = casillas[fila][columna];
			columna++;

			if (columna == columnas) {
				fila++;
				columna = 0;
			}

			return c;
		}

		public Iterator<Celda> iterator() {
			return this;
		}

		// REMOVE NO SE USA
		public void remove() {
		}
	}

	public IteradorCasilla celdas() {
		return new IteradorCasilla();
	}
}